package com.erli.exchange.common.token;

import java.util.Date;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * 
 * @Package com.erli.exchange.common.token   
 * @ClassName:  TokenManager   
 * @Description:Token管理
 * @Author: LeeHo
 * @Date:   2019年3月17日 下午10:14:55   
 *
 */
@ConfigurationProperties(prefix = "exchange.jwt.token")
@Component
@Setter
@Getter
@Slf4j
public class TokenManager {

    private String base64EncodedSecretKey;
    private long expireSeconds;

    /**
     * 
     * @Title: generateToken   
     * @Description: 生成JWT Token
     * @Author: LeeHo
     * @Date:   2019年3月17日 下午9:52:02      
     * @param: @param userId
     * @param: @return      
     * @return: String  
     * @throws
     */
    public String generateToken(long userId) {
        Date currentDate = new Date();
        //过期时间
        Date expireDate = new Date(currentDate.getTime() + expireSeconds * 1000);
        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setSubject(String.valueOf(userId))
                .setIssuedAt(currentDate)
                .setExpiration(expireDate)
                .signWith(SignatureAlgorithm.HS512, base64EncodedSecretKey)
                .compact();
    }

    /**
     * 
     * @Title: getClaimByToken   
     * @Description: TODO
     * @Author: LeeHo
     * @Date:   2019年3月17日 下午9:53:51      
     * @param: @param token
     * @param: @return      
     * @return: Claims  
     * @throws
     */
    public Claims getClaimByToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(base64EncodedSecretKey)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e){
            log.error("TOKEN校验失败", e);
            return null;
        }
    }

    /**
     * 
     * @Title: isTokenExpired   
     * @Description: 判断Token是否过期
     * @Author: LeeHo
     * @Date:   2019年3月17日 下午9:53:08      
     * @param: @param tokenExpiration
     * @param: @return      
     * @return: boolean  
     * @throws
     */
    public boolean isTokenExpired(Date tokenExpiration) {
        return tokenExpiration.before(new Date());
    }
    
}
